package GUI;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

import Verwaltung.Daten.Aktivitaet;
import Verwaltung.Daten.Interfaces.IKlasse;
import Verwaltung.Daten.Interfaces.ILehrkraft;
import Verwaltung.Rechtecontroler.PermissionException;

/**
 * 
 * @author MaximumDataOverdrive
 * 
 *         Diese Klasse realisiert die Dialog-Ansicht, in der Aktivitäten
 *         bearbeitet werden können.
 */
public class AktivitaetBearbeiten extends JDialog implements ActionListener {

	private static final long serialVersionUID = 2231309646972297419L;
	private JLabel lblName;
	private JTextField jNameTextField;
	private JLabel lblStartzeitpunkt;
	private JFormattedTextField jDauerFormattedTextField;
	private JLabel lblDauer;
	private JFormattedTextField jStartZeitpunktFormattedTextField;
	private JList<ILehrkraft> jLehrkraefteList;
	private JList<IKlasse> jKlassenList;
	private JPanel panel;
	private JButton btnAbbrechen;
	private JButton btnSpeichern;
	private JButton btnLschen;
	private JLabel lblLehrkrfte;
	private JComboBox<ILehrkraft> jLehrkraefteComboBox;
	private JButton jAddLehrkraefteButton;
	private JComboBox<IKlasse> jKlassenComboBox;
	private JButton jAddKlassenButton;
	private JSeparator separator_1;
	private JLabel lblKlassen;
	private JLabel lblTag;
	private JComboBox<String> jTagComboBox;
	private JScrollPane scrollPane;
	private JScrollPane scrollPane_1;

	private Aktivitaet aktivitaet = null;
	private JPanel panel_1;
	private JButton btnRemoveKlasse;
	private JPanel panel_2;
	private JButton btnRemoveLehrkraft;

	/**
	 * @wbp.parser.constructor
	 */
	public AktivitaetBearbeiten(final StundenplanerFrame frame) {

		initialize();
	}

	/**
	 * Diese Methode bekommt die Oberfläche mit einer Aktivität übergeben, die
	 * bearbeitet werden soll. Sie updated dabei die Oberfläche.
	 * 
	 * @param frame
	 *            grafische Oberfläche(Fenster)auf der die Panels angezeigt
	 *            werden.
	 * @param aktivi
	 *            Aktivität die in den Stundenplan eingetragen werden kann.
	 */
	public AktivitaetBearbeiten(final StundenplanerFrame frame,
			final Aktivitaet aktivi) {

		this(frame);

		this.aktivitaet = aktivi;

		update();
	}

	/**
	 * Diese Methode aktualisert die Einträge in den
	 * Elementen(TextFeldern,Comboboxen etc.) der GUI und lädt diese dabei neu
	 * aus der Datenbank.
	 */
	public void update() {

		getJNameTextField().setText(aktivitaet.getName());

		getJStartZeitpunktFormattedTextField().setText(
				aktivitaet.getStartHour() + ":" + aktivitaet.getStartMinute());

		getJDauerFormattedTextField().setText(aktivitaet.getDauer() + "");

		getJTagComboBox().setSelectedItem(aktivitaet.getWochentag());

		final DefaultListModel<IKlasse> model = new DefaultListModel<IKlasse>();
		for (final IKlasse klasse : aktivitaet.getKlassen()) {

			model.addElement(klasse);
		}
		getJKlassenList().setModel(model);

		final DefaultListModel<ILehrkraft> modelLe = new DefaultListModel<ILehrkraft>();
		for (final ILehrkraft lehr : aktivitaet.getLehrkraefte()) {

			modelLe.addElement(lehr);
		}

		getJLehrkraefteList().setModel(modelLe);

		final DefaultComboBoxModel<IKlasse> modelCom = new DefaultComboBoxModel<IKlasse>();
		for (final IKlasse klasse : StundenplanController.getInstance()
				.getRechteController().getAlleKlassen()) {
			if (!aktivitaet.getKlassen().contains(klasse)) {
				modelCom.addElement(klasse);
			}
		}
		getJKlassenComboBox().setModel(modelCom);

		try {
			final DefaultComboBoxModel<ILehrkraft> modelComLe = new DefaultComboBoxModel<ILehrkraft>();
			for (final ILehrkraft lehr : StundenplanController.getInstance()
					.getRechteController().getAlleLehrkraefte()) {
				if (!aktivitaet.getLehrkraefte().contains(lehr)) {
					modelComLe.addElement(lehr);
				}
			}

			getJLehrkraefteComboBox().setModel(modelComLe);

			getJTagComboBox().setSelectedItem(aktivitaet.getWochentag());

		} catch (final PermissionException e) {
			// darf nicht auftretten
			e.printStackTrace();
		}

	}

	/**
	 * Diese Methode initialisert die grafische Oberfläche des Dialoges zum
	 * Bearbeiten von Aktivitäten. Dabei werden alle Elemente des Fensters
	 * initialisert.
	 */
	private void initialize() {
		final GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[] { 0, 0, 0, 110, 0 };
		gridBagLayout.rowHeights = new int[] { 0, 0, 0, 56, 0, 17, 68, 16, 22,
				0 };
		gridBagLayout.columnWeights = new double[] { 0.0, 1.0, 0.0, 1.0,
				Double.MIN_VALUE };
		gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
				1.0, 0.0, 0.0, Double.MIN_VALUE };
		getContentPane().setLayout(gridBagLayout);
		final GridBagConstraints gbc_lblName = new GridBagConstraints();
		gbc_lblName.insets = new Insets(0, 0, 5, 5);
		gbc_lblName.gridx = 0;
		gbc_lblName.gridy = 0;
		getContentPane().add(getLblName(), gbc_lblName);
		final GridBagConstraints gbc_jNameTextField = new GridBagConstraints();
		gbc_jNameTextField.gridwidth = 3;
		gbc_jNameTextField.insets = new Insets(5, 0, 5, 0);
		gbc_jNameTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_jNameTextField.gridx = 1;
		gbc_jNameTextField.gridy = 0;
		getContentPane().add(getJNameTextField(), gbc_jNameTextField);
		final GridBagConstraints gbc_lblStartzeitpunkt = new GridBagConstraints();
		gbc_lblStartzeitpunkt.anchor = GridBagConstraints.EAST;
		gbc_lblStartzeitpunkt.insets = new Insets(5, 5, 5, 5);
		gbc_lblStartzeitpunkt.gridx = 0;
		gbc_lblStartzeitpunkt.gridy = 1;
		getContentPane().add(getLblStartzeitpunkt(), gbc_lblStartzeitpunkt);
		final GridBagConstraints gbc_jStartZeitpunktFormattedTextField = new GridBagConstraints();
		gbc_jStartZeitpunktFormattedTextField.insets = new Insets(0, 0, 5, 5);
		gbc_jStartZeitpunktFormattedTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_jStartZeitpunktFormattedTextField.gridx = 1;
		gbc_jStartZeitpunktFormattedTextField.gridy = 1;
		getContentPane().add(getJStartZeitpunktFormattedTextField(),
				gbc_jStartZeitpunktFormattedTextField);
		final GridBagConstraints gbc_lblDauer = new GridBagConstraints();
		gbc_lblDauer.insets = new Insets(0, 0, 5, 5);
		gbc_lblDauer.anchor = GridBagConstraints.EAST;
		gbc_lblDauer.gridx = 2;
		gbc_lblDauer.gridy = 1;
		getContentPane().add(getLblDauer(), gbc_lblDauer);
		final GridBagConstraints gbc_jDauerFormattedTextField = new GridBagConstraints();
		gbc_jDauerFormattedTextField.insets = new Insets(0, 0, 5, 0);
		gbc_jDauerFormattedTextField.fill = GridBagConstraints.HORIZONTAL;
		gbc_jDauerFormattedTextField.gridx = 3;
		gbc_jDauerFormattedTextField.gridy = 1;
		getContentPane().add(getJDauerFormattedTextField(),
				gbc_jDauerFormattedTextField);
		final GridBagConstraints gbc_lblTag = new GridBagConstraints();
		gbc_lblTag.insets = new Insets(0, 0, 5, 5);
		gbc_lblTag.gridx = 0;
		gbc_lblTag.gridy = 2;
		getContentPane().add(getLblTag(), gbc_lblTag);
		final GridBagConstraints gbc_jTagComboBox = new GridBagConstraints();
		gbc_jTagComboBox.insets = new Insets(0, 0, 5, 5);
		gbc_jTagComboBox.fill = GridBagConstraints.HORIZONTAL;
		gbc_jTagComboBox.gridx = 1;
		gbc_jTagComboBox.gridy = 2;
		getContentPane().add(getJTagComboBox(), gbc_jTagComboBox);
		final GridBagConstraints gbc_lblLehrkrfte = new GridBagConstraints();
		gbc_lblLehrkrfte.insets = new Insets(0, 0, 5, 5);
		gbc_lblLehrkrfte.gridx = 0;
		gbc_lblLehrkrfte.gridy = 3;
		getContentPane().add(getLblLehrkrfte(), gbc_lblLehrkrfte);
		final GridBagConstraints gbc_jLehrkraefteComboBox = new GridBagConstraints();
		gbc_jLehrkraefteComboBox.insets = new Insets(0, 0, 5, 5);
		gbc_jLehrkraefteComboBox.fill = GridBagConstraints.HORIZONTAL;
		gbc_jLehrkraefteComboBox.gridx = 1;
		gbc_jLehrkraefteComboBox.gridy = 3;
		getContentPane().add(getJLehrkraefteComboBox(),
				gbc_jLehrkraefteComboBox);
		final GridBagConstraints gbc_panel_2 = new GridBagConstraints();
		gbc_panel_2.gridheight = 2;
		gbc_panel_2.insets = new Insets(0, 0, 5, 5);
		gbc_panel_2.fill = GridBagConstraints.BOTH;
		gbc_panel_2.gridx = 2;
		gbc_panel_2.gridy = 3;
		getContentPane().add(getPanel_2(), gbc_panel_2);
		final GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.gridheight = 2;
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.insets = new Insets(0, 0, 5, 0);
		gbc_scrollPane.gridx = 3;
		gbc_scrollPane.gridy = 3;
		getContentPane().add(getScrollPane(), gbc_scrollPane);
		final GridBagConstraints gbc_separator_1 = new GridBagConstraints();
		gbc_separator_1.gridwidth = 4;
		gbc_separator_1.insets = new Insets(0, 0, 5, 0);
		gbc_separator_1.gridx = 0;
		gbc_separator_1.gridy = 5;
		getContentPane().add(getSeparator_1(), gbc_separator_1);
		final GridBagConstraints gbc_lblKlassen = new GridBagConstraints();
		gbc_lblKlassen.insets = new Insets(0, 0, 5, 5);
		gbc_lblKlassen.gridx = 0;
		gbc_lblKlassen.gridy = 6;
		getContentPane().add(getLblKlassen(), gbc_lblKlassen);
		final GridBagConstraints gbc_jKlassenComboBox = new GridBagConstraints();
		gbc_jKlassenComboBox.insets = new Insets(0, 0, 5, 5);
		gbc_jKlassenComboBox.fill = GridBagConstraints.HORIZONTAL;
		gbc_jKlassenComboBox.gridx = 1;
		gbc_jKlassenComboBox.gridy = 6;
		getContentPane().add(getJKlassenComboBox(), gbc_jKlassenComboBox);
		final GridBagConstraints gbc_panel_1 = new GridBagConstraints();
		gbc_panel_1.gridheight = 2;
		gbc_panel_1.fill = GridBagConstraints.BOTH;
		gbc_panel_1.insets = new Insets(0, 0, 5, 5);
		gbc_panel_1.gridx = 2;
		gbc_panel_1.gridy = 6;
		getContentPane().add(getPanel_1(), gbc_panel_1);
		final GridBagConstraints gbc_scrollPane_1 = new GridBagConstraints();
		gbc_scrollPane_1.gridheight = 2;
		gbc_scrollPane_1.fill = GridBagConstraints.BOTH;
		gbc_scrollPane_1.insets = new Insets(0, 0, 5, 0);
		gbc_scrollPane_1.gridx = 3;
		gbc_scrollPane_1.gridy = 6;
		getContentPane().add(getScrollPane_1(), gbc_scrollPane_1);
		final GridBagConstraints gbc_panel = new GridBagConstraints();
		gbc_panel.insets = new Insets(5, 5, 0, 0);
		gbc_panel.gridwidth = 4;
		gbc_panel.fill = GridBagConstraints.BOTH;
		gbc_panel.gridx = 0;
		gbc_panel.gridy = 8;
		getContentPane().add(getPanel(), gbc_panel);
	}

	/**
	 * Diese Methode erzeugt das Label mit "Name" in dem Dialog.
	 * 
	 * @return lblName Label indem "Name" steht
	 */
	private JLabel getLblName() {
		if (lblName == null) {
			lblName = new JLabel("Name");
		}
		return lblName;
	}

	/**
	 * Diese Methode gibt das Text-Feld für den Namen der Aktivität zurück. Gibt
	 * es dieses nicht, wird es neu initialisert.
	 * 
	 * @return jNameTextField Text-Feld indem der Name der Aktivität steht
	 */
	private JTextField getJNameTextField() {
		if (jNameTextField == null) {
			jNameTextField = new JTextField();
			jNameTextField.setColumns(10);
		}
		return jNameTextField;
	}

	/**
	 * Diese Methode gibt das Label mit "Startzeitpunkt" zurück. Gibt es dieses
	 * nicht, wird es neu initialisert.
	 * 
	 * @return lblStartzeitpunt Label indem "Startzeitpunkt" steht.
	 */
	private JLabel getLblStartzeitpunkt() {
		if (lblStartzeitpunkt == null) {
			lblStartzeitpunkt = new JLabel("Startzeitpunkt");
		}
		return lblStartzeitpunkt;
	}

	/**
	 * Diese Methode gibt das Text-Feld für die Dauer der Aktivität zurück. Gibt
	 * es dieses nicht, wird es neu initialisert.
	 * 
	 * @return jDauerFormattedTextField Text-Feld indem die Dauer der Aktivität
	 *         steht
	 */
	private JFormattedTextField getJDauerFormattedTextField() {
		if (jDauerFormattedTextField == null) {
			jDauerFormattedTextField = new JFormattedTextField();
			// todo einschränkung auf int
		}
		return jDauerFormattedTextField;
	}

	/**
	 * Diese Methode gibt das Label mit "Dauer" zurück. Gibt es dieses nicht,
	 * wird es neu initialisert.
	 * 
	 * @return lblDauer Label indem "Dauer" steht.
	 */
	private JLabel getLblDauer() {
		if (lblDauer == null) {
			lblDauer = new JLabel("Dauer");
		}
		return lblDauer;
	}

	/**
	 * Diese Methode gibt das Text-Feld für den Startzeitpunkt der Aktivität
	 * zurück. Gibt es dieses nicht, wird es neu initialisert.
	 * 
	 * @return jStartZeitpunktFormattedTextField Text-Feld indem der
	 *         Startzeitpunkt der Aktivität steht.
	 */
	private JFormattedTextField getJStartZeitpunktFormattedTextField() {
		if (jStartZeitpunktFormattedTextField == null) {
			jStartZeitpunktFormattedTextField = new JFormattedTextField();
			jStartZeitpunktFormattedTextField.setEditable(false);
		}
		return jStartZeitpunktFormattedTextField;
	}

	/**
	 * Diese Methode gibt die Liste der Lehrkräfte zurück, die an der Aktivität
	 * teilnehmen. Gibt es diese nicht, wird es neu initialisert.
	 * 
	 * @return jLehrkraefteList Liste mit Lehrkräften, die einer Aktivität
	 *         zugeteilt worden sind
	 */
	private JList<ILehrkraft> getJLehrkraefteList() {
		if (jLehrkraefteList == null) {
			jLehrkraefteList = new JList<ILehrkraft>();
		}
		return jLehrkraefteList;
	}

	/**
	 * Diese Methode gibt die Liste der Klassen zurück, die an der Aktivität
	 * teilnehmen. Gibt es diese nicht, wird es neu initialisert.
	 * 
	 * @return jKlassenList Liste mit Klassen, die einer Aktivität zugeteilt
	 *         worden sind
	 */
	private JList<IKlasse> getJKlassenList() {
		if (jKlassenList == null) {
			jKlassenList = new JList<IKlasse>();
		}
		return jKlassenList;
	}

	/**
	 * Diese Methode gibt das Panel zurück, der die Buttons für die
	 * Funktionalität des Dialoges enthält. Existiert dieses nicht, wird dieses
	 * neu erzeugt.
	 * 
	 * @return panel Anzeige mit Bedienelementen des Dialoges.
	 */
	private JPanel getPanel() {
		if (panel == null) {
			panel = new JPanel();
			final GridBagLayout gbl_panel = new GridBagLayout();
			gbl_panel.columnWidths = new int[] { 0, 0, 0, 0 };
			gbl_panel.rowHeights = new int[] { 0, 0 };
			gbl_panel.columnWeights = new double[] { 1.0, 1.0, 1.0,
					Double.MIN_VALUE };
			gbl_panel.rowWeights = new double[] { 0.0, Double.MIN_VALUE };
			panel.setLayout(gbl_panel);
			final GridBagConstraints gbc_btnAbbrechen = new GridBagConstraints();
			gbc_btnAbbrechen.insets = new Insets(0, 0, 0, 5);
			gbc_btnAbbrechen.gridx = 0;
			gbc_btnAbbrechen.gridy = 0;
			panel.add(getBtnAbbrechen(), gbc_btnAbbrechen);
			final GridBagConstraints gbc_btnLschen = new GridBagConstraints();
			gbc_btnLschen.insets = new Insets(0, 0, 0, 5);
			gbc_btnLschen.gridx = 1;
			gbc_btnLschen.gridy = 0;
			panel.add(getBtnLschen(), gbc_btnLschen);
			final GridBagConstraints gbc_btnSpeichern = new GridBagConstraints();
			gbc_btnSpeichern.gridx = 2;
			gbc_btnSpeichern.gridy = 0;
			panel.add(getBtnSpeichern(), gbc_btnSpeichern);
		}
		return panel;
	}

	/**
	 * Diese Methode gibt den Button: btnAbbrechen zurück. Existiert dieser
	 * nicht, wird er neu initialisert.
	 * 
	 * @return btnAbbrechen Button der das Abbrechen des Dialog-Fensters
	 *         ermöglicht.
	 */
	private JButton getBtnAbbrechen() {
		if (btnAbbrechen == null) {
			btnAbbrechen = new JButton("Abbrechen");
			btnAbbrechen.addActionListener(this);
		}
		return btnAbbrechen;
	}

	/**
	 * Diese Methode gibt den Button: btnSpeichern zurück. Existiert dieser
	 * nicht, wird er neu initialisert.
	 * 
	 * @return btnSpeichern Button der das Speichern der bearbeiteten Aktivität
	 *         in der Datenbank ermöglicht.
	 */
	private JButton getBtnSpeichern() {
		if (btnSpeichern == null) {
			btnSpeichern = new JButton("Speichern");
			btnSpeichern.addActionListener(this);
		}
		return btnSpeichern;
	}

	/**
	 * Diese Methode gibt den Button: btnLschen zurück. Existiert dieser nicht,
	 * wird er neu initialisert.
	 * 
	 * @return btnLschen Button der das Löschen der ausgewählten Aktivität in
	 *         der Datenbank ermöglicht.
	 */
	private JButton getBtnLschen() {
		if (btnLschen == null) {
			btnLschen = new JButton("Löschen");
			btnLschen.addActionListener(this);
		}
		return btnLschen;
	}

	/**
	 * Diese Methode gibt das Label mit "Lehrkräfte" zurück. Gibt es dieses
	 * nicht, wird es neu initialisert.
	 * 
	 * @return lblLehrkrfte Label indem "Lehrkräfte" steht.
	 */
	private JLabel getLblLehrkrfte() {
		if (lblLehrkrfte == null) {
			lblLehrkrfte = new JLabel("Lehrkräfte");
		}
		return lblLehrkrfte;
	}

	/**
	 * Diese Methode gibt die ComboBox mit den Lehrkräften zurück, die an der
	 * Aktivität teilnehmen. Gibt es diese nicht, wird diese neu initialisert.
	 * 
	 * @return jLehrkraefteComboBox ComboBox mit Lehrkräften, die der Aktivität
	 *         zugeteilt sind.
	 */
	private JComboBox<ILehrkraft> getJLehrkraefteComboBox() {
		if (jLehrkraefteComboBox == null) {
			jLehrkraefteComboBox = new JComboBox<ILehrkraft>();
		}
		return jLehrkraefteComboBox;
	}

	/**
	 * Diese Methode gibt den Button: jAddLehrkraefteButton zurück. Existiert
	 * dieser nicht, wird er neu initialisert.
	 * 
	 * @return jAddLehrkraefteButton Button der das Hinzufügen von Lehrkräften
	 *         zu der Aktivität ermöglicht.
	 */
	private JButton getJAddLehrkraefteButton() {
		if (jAddLehrkraefteButton == null) {
			jAddLehrkraefteButton = new JButton("+");
			jAddLehrkraefteButton.addActionListener(this);
		}
		return jAddLehrkraefteButton;
	}

	/**
	 * Diese Methode gibt die ComboBox mit den Klassen zurück, die an der
	 * Aktivität teilnehmen. Gibt es diese nicht, wird diese neu initialisert.
	 * 
	 * @return jLehrkraefteComboBox ComboBox mit Lehrkräften, die der Aktivität
	 *         zugeteilt sind.
	 */
	private JComboBox<IKlasse> getJKlassenComboBox() {
		if (jKlassenComboBox == null) {
			jKlassenComboBox = new JComboBox<IKlasse>();
		}
		return jKlassenComboBox;
	}

	/**
	 * Diese Methode gibt den Button: jAddKlassenButton zurück. Existiert dieser
	 * nicht, wird er neu initialisert.
	 * 
	 * @return jAddKlassenButton Button der das Hinzufügen von Klassen zu der
	 *         Aktivität ermöglicht.
	 */
	private JButton getJAddKlassenButton() {
		if (jAddKlassenButton == null) {
			jAddKlassenButton = new JButton("+");
			jAddKlassenButton.addActionListener(this);
		}
		return jAddKlassenButton;
	}

	/**
	 * Diese Methode ist gibt ein optisches Element zurück und erzeugt dieses
	 * gegebenenfalls neu.
	 * 
	 * @return separator_1 Linie
	 */
	private JSeparator getSeparator_1() {
		if (separator_1 == null) {
			separator_1 = new JSeparator();
		}
		return separator_1;
	}

	/**
	 * Diese Methode gibt das Label mit "Klassen" zurück. Gibt es dieses nicht,
	 * wird es neu initialisert.
	 * 
	 * @return lblKlassen Label indem "Klassen" steht.
	 */
	private JLabel getLblKlassen() {
		if (lblKlassen == null) {
			lblKlassen = new JLabel("Klassen");
		}
		return lblKlassen;
	}

	/**
	 * Diese Methode gibt das Label mit "Tag" zurück. Gibt es dieses nicht, wird
	 * es neu initialisert.
	 * 
	 * @return lblTag Label indem "Tag" steht.
	 */
	private JLabel getLblTag() {
		if (lblTag == null) {
			lblTag = new JLabel("Tag");
		}
		return lblTag;
	}

	/**
	 * Diese Methode gibt die ComboBox mit dem Tag zurück, an dem die Aktivität
	 * stattfinden kann. Gibt es diese nicht, wird diese neu initialisert.
	 * 
	 * @return jTagComboBox ComboBox mit Tagen an denen die Aktivität
	 *         stattfinden kann.
	 */
	private JComboBox<String> getJTagComboBox() {
		if (jTagComboBox == null) {
			jTagComboBox = new JComboBox<String>();

			final DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>();
			model.addElement("Montag");
			model.addElement("Dienstag");
			model.addElement("Mittwoch");
			model.addElement("Donnerstag");
			model.addElement("Freitag");

			jTagComboBox.setModel(model);

			jTagComboBox.setEditable(false);
			jTagComboBox.setEnabled(false);
		}
		return jTagComboBox;
	}

	/**
	 * Diese Methode gibt das Scroll-Panel mit dem eingetragenen Lehrkräften
	 * zurück, die der Aktivität zugeteilt worden sind. Gibt es dieses nicht,
	 * wird dieses neu initialisert.
	 * 
	 * @return scrollPane Scroll-Panel mit Lehrkräften, die der Aktivität
	 *         zugeteilt worden sind.
	 */
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane
					.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
			scrollPane.setViewportView(getJLehrkraefteList());
		}
		return scrollPane;
	}

	/**
	 * Diese Methode gibt das Scroll-Panel mit dem eingetragenen Klassen zurück,
	 * die der Aktivität zugeteilt worden sind. Gibt es dieses nicht, wird
	 * dieses neu initialisert.
	 * 
	 * @return scrollPane_1 Scroll-Panel mit Klassen, die der Aktivität
	 *         zugeteilt worden sind.
	 */
	private JScrollPane getScrollPane_1() {
		if (scrollPane_1 == null) {
			scrollPane_1 = new JScrollPane();
			scrollPane_1
					.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
			scrollPane_1.setViewportView(getJKlassenList());
		}
		return scrollPane_1;
	}

	/**
	 * Diese Methode enthält alle Funktionen, die bei der Betätigung der
	 * jeweiligen Elemente ausgeführt werden. Dabei wird bei den if-Bedigungen
	 * geprüft, welches Element betätigt worden ist und die gewünschte Funktion
	 * wird ausgeführt.
	 */
	@Override
	public void actionPerformed(final ActionEvent ae) {

		if (ae.getSource() == getJAddKlassenButton()) {

			final IKlasse klasse = (IKlasse) getJKlassenComboBox()
					.getSelectedItem();

			((DefaultListModel<IKlasse>) getJKlassenList().getModel())
					.addElement(klasse);

			getJKlassenComboBox().removeItem(klasse);

			// StundenplanController.getInstance().checkUeberdeckung(aktivitaet);

		} else if (ae.getSource() == getJAddLehrkraefteButton()) {

			final ILehrkraft lehr = (ILehrkraft) getJLehrkraefteComboBox()
					.getSelectedItem();

			((DefaultListModel<ILehrkraft>) getJLehrkraefteList().getModel())
					.addElement(lehr);

			getJLehrkraefteComboBox().removeItem(lehr);

			// StundenplanController.getInstance().checkUeberdeckung(aktivitaet);

		} else if (ae.getSource() == getBtnSpeichern()) {


			final String[] a = getJStartZeitpunktFormattedTextField().getText()
					.split(":");
			final int stunde = Integer.parseInt(a[0]);
			final int minute = Integer.parseInt(a[1]);
			final int dauer = Integer.parseInt(getJDauerFormattedTextField()
					.getText());
			final List<ILehrkraft> lehrkraefte = new ArrayList<ILehrkraft>();
			for (int i = 0; i < getJLehrkraefteList().getModel().getSize(); i++) {
				lehrkraefte.add(getJLehrkraefteList().getModel()
						.getElementAt(i));
			}
			final List<IKlasse> klassen = new ArrayList<IKlasse>();
			for (int i = 0; i < getJKlassenList().getModel().getSize(); i++) {
				klassen.add(getJKlassenList().getModel().getElementAt(i));
			}
			try {
				if (!aktivitaet.isDummy()) {
					StundenplanController.getInstance().getRechteController()
							.removeAktivitaet(aktivitaet.getId());
				}
				Aktivitaet akti = StundenplanController
						.getInstance()
						.getRechteController()
						.addAktivitaet(getJNameTextField().getText(),
								getJTagComboBox().getSelectedItem().toString(),
								stunde, minute, dauer, lehrkraefte, klassen);
			

				try {
					if(!StundenplanController.getInstance().checkUeberdeckung()) {
						StundenplanController.getInstance().getRechteController().removeAktivitaet(akti.getId());
						return;
					}
					StundenplanController.getInstance().update();
				} catch (final PermissionException e) {
					e.printStackTrace();
				}
				
			} catch (final PermissionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			setVisible(false);
			dispose();

		} else if (ae.getSource() == getBtnLschen()) {

			final int n = JOptionPane.showConfirmDialog(null,
					"Soll die Aktivität wirklich gelöscht werden?", "Löschen",
					JOptionPane.YES_NO_OPTION);
			if (n == JOptionPane.YES_OPTION) {
				try {
					StundenplanController.getInstance().getRechteController()
							.removeAktivitaet(aktivitaet.getId());

					StundenplanController.getInstance().update();

					dispose();
				} catch (final PermissionException e) {

					e.printStackTrace();
				}

			}

		} else if (ae.getSource() == getBtnAbbrechen()) {
			setVisible(false);
			dispose();
		} else if (ae.getSource() == getBtnRemoveKlasse()) {

			final int id = getJKlassenList().getSelectedIndex();
			if (id >= 0) {

				if (aktivitaet.getKlassen().contains(
						getJKlassenList().getSelectedValue())) {
					aktivitaet.removeKlasse(getJKlassenList()
							.getSelectedValue());
				}
				final DefaultListModel<IKlasse> model = (DefaultListModel<IKlasse>) getJKlassenList()
						.getModel();
				model.removeElementAt(id);

				update();
			} else {
				JOptionPane.showMessageDialog(this, "Keine Klasse ausgewählt");
			}

		} else if (ae.getSource() == getBtnRemoveLehrkraft()) {

			final int id = getJLehrkraefteList().getSelectedIndex();
			if (id >= 0) {

				if (aktivitaet.getLehrkraefte().contains(
						getJLehrkraefteList().getSelectedValue())) {

					aktivitaet.removeLehrkraft(getJLehrkraefteList()
							.getSelectedValue());
				}
				final DefaultListModel<ILehrkraft> model = (DefaultListModel<ILehrkraft>) getJLehrkraefteList()
						.getModel();
				model.removeElementAt(id);

				update();
			} else {
				JOptionPane.showMessageDialog(this,
						"Keine Lehrkraft ausgewählt");
			}
		}

	}

	/**
	 * Diese Methode gibt das Panel zurück, der die Buttons für die
	 * Funktionalität des Dialoges enthält. Existiert dieses nicht, wird dieses
	 * neu erzeugt.
	 * 
	 * @return panel_1 Anzeige mit Bedienelementen des Dialoges.
	 */
	private JPanel getPanel_1() {
		if (panel_1 == null) {
			panel_1 = new JPanel();
			final GridBagLayout gbl_panel_1 = new GridBagLayout();
			gbl_panel_1.columnWidths = new int[] { 0, 0 };
			gbl_panel_1.rowHeights = new int[] { 0, 0, 0 };
			gbl_panel_1.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
			gbl_panel_1.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
			panel_1.setLayout(gbl_panel_1);
			final GridBagConstraints gbc_jAddKlassenButton = new GridBagConstraints();
			gbc_jAddKlassenButton.insets = new Insets(0, 0, 5, 0);
			gbc_jAddKlassenButton.gridx = 0;
			gbc_jAddKlassenButton.gridy = 0;
			panel_1.add(getJAddKlassenButton(), gbc_jAddKlassenButton);
			final GridBagConstraints gbc_btnRemoveKlasse = new GridBagConstraints();
			gbc_btnRemoveKlasse.fill = GridBagConstraints.BOTH;
			gbc_btnRemoveKlasse.gridx = 0;
			gbc_btnRemoveKlasse.gridy = 1;
			panel_1.add(getBtnRemoveKlasse(), gbc_btnRemoveKlasse);
		}
		return panel_1;
	}

	/**
	 * Diese Methode gibt den Button: btnRemoveKlasse zurück. Existiert dieser
	 * nicht, wird er neu initialisert.
	 * 
	 * @return btnRemoveKlasse Button der das Entfernen von Klassen von der
	 *         Aktivität ermöglicht.
	 */
	private JButton getBtnRemoveKlasse() {
		if (btnRemoveKlasse == null) {
			btnRemoveKlasse = new JButton("-");
			btnRemoveKlasse.addActionListener(this);
		}
		return btnRemoveKlasse;
	}

	/**
	 * Diese Methode gibt das Panel zurück, der die Buttons für die
	 * Funktionalität des Dialoges enthält. Existiert dieses nicht, wird dieses
	 * neu erzeugt.
	 * 
	 * @return panel_2 Anzeige mit Bedienelementen des Dialoges.
	 */
	private JPanel getPanel_2() {
		if (panel_2 == null) {
			panel_2 = new JPanel();
			final GridBagLayout gbl_panel_2 = new GridBagLayout();
			gbl_panel_2.columnWidths = new int[] { 0, 0 };
			gbl_panel_2.rowHeights = new int[] { 0, 0, 0 };
			gbl_panel_2.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
			gbl_panel_2.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
			panel_2.setLayout(gbl_panel_2);
			final GridBagConstraints gbc_jAddLehrkraefteButton = new GridBagConstraints();
			gbc_jAddLehrkraefteButton.insets = new Insets(0, 0, 5, 0);
			gbc_jAddLehrkraefteButton.gridx = 0;
			gbc_jAddLehrkraefteButton.gridy = 0;
			panel_2.add(getJAddLehrkraefteButton(), gbc_jAddLehrkraefteButton);
			final GridBagConstraints gbc_btnRemoveLehrkraft = new GridBagConstraints();
			gbc_btnRemoveLehrkraft.fill = GridBagConstraints.HORIZONTAL;
			gbc_btnRemoveLehrkraft.gridx = 0;
			gbc_btnRemoveLehrkraft.gridy = 1;
			panel_2.add(getBtnRemoveLehrkraft(), gbc_btnRemoveLehrkraft);
		}
		return panel_2;
	}

	/**
	 * Diese Methode gibt den Button: btnRemoveLehrkraft zurück. Existiert
	 * dieser nicht, wird er neu initialisert.
	 * 
	 * @return btnRemoveLehrkraft Button der das Entfernen von einer Lehrkraft
	 *         von der Aktivität ermöglicht.
	 */
	private JButton getBtnRemoveLehrkraft() {
		if (btnRemoveLehrkraft == null) {
			btnRemoveLehrkraft = new JButton("-");
			btnRemoveLehrkraft.addActionListener(this);
		}
		return btnRemoveLehrkraft;
	}
}
